package com.changgou.search.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.goods.feign.SkuFeign;
import com.changgou.goods.pojo.Sku;
import com.changgou.search.dao.ESManagerMapper;
import com.changgou.search.pojo.SkuInfo;
import com.changgou.search.service.ESManagerService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class ESManagerServiceimpl implements ESManagerService {

    //用于查询商品的接口
    @Autowired
    private SkuFeign skuFeign;

    //导入操作ES的 Mapper
    @Autowired
    private ESManagerMapper esManagerMapper;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;//用来构建ES 索引结构的模板

    //构建 ES 索引 以及映射
    @Override
    public void createMappingAndIndex() {
        //创建索引
        elasticsearchTemplate.createIndex(SkuInfo.class);  //根据 SkuInfo 实体类 构建ES 数据库 索引(相当于MySql表)
        //创建映射
        elasticsearchTemplate.putMapping(SkuInfo.class);  //根据 SkuInfo 实体类 构建 ES 数据库 映射 (相当于MySql的表结构)

    }

    //查询数据库中的 所有商品信息,并存入ES中
    @Override
    public void importAll() {
        List<Sku> skuList = skuFeign.skuList("all"); //查询数据库中 所有已审核的商品

        if(skuList.isEmpty()){  //判断查到的商品是否为空
            throw new RuntimeException("商品导入失败,查询到的商品数据为0");
        }
        // 数据类型转换 , ES 接收的是Skuinfo类型数据 , 而 现在是 Sku类型数据
        //1.第一种 类型转换方法
        List<SkuInfo> skuInfoList = new ArrayList();
        for (Sku sku : skuList) {
            SkuInfo skuInfo = new SkuInfo();
            BeanUtils.copyProperties(sku,skuInfo);  //将 Sku的属性值 赋值到 Skuinfo中,但是需要确保两者属性一致;
            skuInfo.setId(Long.parseLong(sku.getId())); //因为 Sku中的ID属性为String类型,而Skuinfo中的ID属性为Long类型,所以需要手动赋值注入;
            skuInfoList.add(skuInfo); //将赋值完的 Skuinfo 放入List中
        }

        //因为 从数据库中查到的规格参数为 Json格式的 String类型; 为了防止出错 , 需要将该Json 转换成Map并存如ES
        for (SkuInfo skuInfo : skuInfoList) {
            Map map = JSON.parseObject(skuInfo.getSpec(), Map.class);
            skuInfo.setSpecMap(map);
        }
        //第二种方法 为 : 将Sku转成Json 格式, 再将Json格式转成 Skuinfo;

        esManagerMapper.saveAll(skuInfoList); //存入 ES(索引库)
       }


    //根据 SpuId在数据库中查询指定商品,并加入 ES 索引库
    @Override
    public void importDataBySpuId(String spuId) {

        List<Sku> skuList = skuFeign.skuList(spuId); //根据 SpuId查询商品 ,

        if(skuList.isEmpty()){  //判断查到的商品是否为空
            throw new RuntimeException("商品导入失败,查询到的商品数据为0");
        }
        // 数据类型转换 , ES 接收的是Skuinfo类型数据 , 而 现在是 Sku类型数据
        List<SkuInfo> skuInfoList = new ArrayList();
        for (Sku sku : skuList) {
            SkuInfo skuInfo = new SkuInfo();
            BeanUtils.copyProperties(sku,skuInfo);  //将 Sku的属性值 赋值到 Skuinfo中,但是需要确保两者属性一致;
            skuInfo.setId(Long.parseLong(sku.getId())); //因为 Sku中的ID属性为String类型,而Skuinfo中的ID属性为Long类型,所以需要手动赋值注入;
            skuInfo.setSpuId(Long.parseLong(sku.getSpuId()));//因为 Sku中的spuID属性为String类型,而Skuinfo中的spuID属性为Long类型,所以需要手动赋值注入;
            skuInfoList.add(skuInfo); //将赋值完的 Skuinfo 放入List中
        }

        //因为 从数据库中查到的规格参数为 Json格式的 String类型; 为了防止出错 , 需要将该Json 转换成Map并存如ES
        for (SkuInfo skuInfo : skuInfoList) {
            Map map = JSON.parseObject(skuInfo.getSpec(), Map.class);
            skuInfo.setSpecMap(map);
        }
        //第二种方法 为 : 将Sku转成Json 格式, 再将Json格式转成 Skuinfo;

        esManagerMapper.saveAll(skuInfoList); //存入 ES(索引库)
    }

    @Override
    public void delDataBySpuId(String spuId) {
        //根据SpuID查询 所属的 所有SkuId
        List<Sku> skuList = skuFeign.skuList(spuId);
        if(skuList.isEmpty()){
            throw new RuntimeException("数据库中无该类商品,删除失败");
        }

        //根据skuId删除ES索引库中的对应商品
        for (Sku sku : skuList) {
            esManagerMapper.deleteById(Long.parseLong(sku.getId()));
            System.out.println("删除skuId为 : "+sku.getId() +"的商品");
        }


    }


}
